﻿// 3451. 字符串排序II.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;
/*
https://www.acwing.com/problem/content/3454/
编写一个程序，将输入字符串中的字符按如下规则排序。

规则 1：英文字母从 A到 Z 排列，不区分大小写。如，输入：Type 输出：epTy。
规则 2：同一个英文字母的大小写同时存在时，按照输入顺序排列。如，输入：BabA 输出：aABb。
规则 3：非英文字母的其它字符保持原来的位置。如，输入：By?e 输出：Be?y。
输入格式
输入包含多组测试数据。

每组数据占一行，包含一个字符串。

输出格式
每组数据输出一行结果，为按要求排序后的字符串。

数据范围
字符串长度不超过 1000，每个输入最多包含 100 组数据。

输入样例：
A Famous Saying: Much Ado About Nothing (2012/8).
输出样例：
A aaAAbc dFgghh: iimM nNn oooos Sttuuuy (2012/8).
*/

const int N = 1010;

char str[N];

struct ELE {
	char c; int idx;
}ele[N];
int idx;

bool cmp(const struct ELE& a, const struct ELE& b) {
	if (abs(a.c - b.c) == 32) {
		return a.idx < b.idx;
	}

	char aa = toupper(a.c);  char bb = toupper(b.c);
	return aa < bb;
}

void solve() {
	int len = strlen(str);
	idx = 0;
	for (int i = 0; i < len; i++) {
		if (str[i] >= 'A' && str[i] <= 'Z') {
			ele[idx].c = str[i]; ele[idx].idx = i;
			idx++; str[i] = 127;
		}
		else if (str[i] >= 'a' && str[i] <= 'z') {
			ele[idx].c = str[i]; ele[idx].idx = i;
			idx++; str[i] = 127;
		}
	}

	stable_sort(ele, ele + idx, cmp);
	idx = 0;
	for (int i = 0; i < len; i++) {
		if (str[i] == 127) {
			str[i] = ele[idx].c; idx++;
		}
	}

	cout << str << endl;

	return;
}


int main()
{
	while (cin.getline(str, 1001)) {
		solve();
	}

	return 0;
}

